// 删除有序数组中的重复项 - 简单题
// 思路:
// 定义快慢指针, 快指针在前面探路, 找到不重复的元素就赋值给slow, 并且slow前进一步
class Solution {
public:
    int removeDuplicates(vector<int>& nums) 
    {
        if(nums.size() == 0)
            return 0;

        // 定义快慢指针, 快指针走在前面探路
        // 找到一个不重复的数字就赋值给slow, 并让slow前进一步
        int slow = 0, fast = 0;
        while(fast < nums.size())
        {
            if(nums[slow] != nums[fast])
            {
                slow++;
                nums[slow] = nums[fast];
            }

            fast++;
        }

        return slow + 1;
    }
};


// 删除排序链表中的重复元素
// 思路: - 模仿上面数组中的思路
// 定义快慢指针 - 记得断开与后面重复元素的连接
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) 
    {
        if(head == nullptr)
            return nullptr;
        
        // 定义快慢指针
        ListNode* slow = head, *fast = head;

        while(fast != nullptr)
        {
            if(slow->val != fast->val)
            {
                slow->next = fast;
                slow = slow->next;
            }

            fast = fast->next;
        }

        // 断开与最后的重复元素的连接
        slow->next = nullptr;

        return head;
    }   
};



// 移除元素 - 简单题
class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        if(nums.size() == 0)
            return 0;

        // 定义快慢指针 - 思路跟上面题目类似, 有一点差异
        int slow = 0, fast = 0;

        while(fast < nums.size())
        {
            if(nums[fast] != val)
            {
                nums[slow] = nums[fast];
                slow++;
            }

            fast++;
        }

        return slow;
    }
};




